/*
* 1.创建一个空对象

* 2.链接到原型

* 3.绑定this值

* 4.返回新对象，
 如果构造器没有手动返回对象，则返回第一步创建的新对象，如果有，则舍弃掉第一步创建的新对象，返回手动return的对象。


*/

/**
 *第一个参数是被new的构造函数，后面是构造函数的参数
 * createNew(Fn,...arguments)
 */
function createNew(constructor,...args){
    if (typeof constructor !== "function") {
        console.error("type error");
        return
    }
    //1.创建一个空对象
    let obj = {}
    let result = null

    //2.连接到原型
    obj.__proto__ = constructor.prototype
    //3.绑定this
    //使用apply，将构造函数中的this指向新对象，这样新对象就可以访问构造函数中的属性和方法
     result = constructor.apply(obj,args)
    //4.返回新对象
    //如果返回值是一个对象就返回该对象，否则返回构造函数的一个实例对象
    return typeof result === "object" ? result : obj;
}

function People(name,age,phone) {
    this.name = name
    this.age = age
    this.phone = phone
}

let peo = createNew(People,'Bob',22,123456789)
console.log(peo.name)
console.log(peo.age)
console.log(peo.phone)


